"""SQL文件操作工具类"""
import shutil
import json
from pathlib import Path
from typing import Dict, Any, Callable
from src.base.registry import bera
import argparse

class SQLFileOps:
    """SQL文件操作工具类"""

    @classmethod
    def read_sql_file(cls, file_path: str, test_mode: bool = False) -> str:
        """读取SQL文件内容

        Args:
            file_path: SQL文件路径
            test_mode: 是否为测试模式，如果为True则只能读取测试目录下的文件

        Returns:
            str: SQL文件内容

        Raises:
            FileNotFoundError: 文件不存在
            IOError: 读取文件失败
            ValueError: 测试模式下尝试读取非测试目录的文件
        """
        if test_mode and not str(file_path).startswith(('tests/assets/', 'artifacts/test/')):
            raise ValueError(f"测试模式下只能读取tests/assets目录下的文件: {file_path}")

        with open(file_path, 'r', encoding='utf-8') as f:
            return f.read()

    @classmethod
    def write_json_file(cls, path: Path, content: Dict[str, Any], verbose: bool = False) -> None:
        """写入JSON文件

        Args:
            path: 文件路径
            content: 要写入的内容
            verbose: 是否显示详细日志
        """
        cls.ensure_directory(path.parent)
        path.write_text(json.dumps(content, indent=2, ensure_ascii=False), encoding='utf-8')

        if verbose:
            bera.logger.debug(f"写入JSON文件: {path}")

    @classmethod
    def read_json_file(cls, path: Path, verbose: bool = False) -> Dict[str, Any]:
        """读取JSON文件

        Args:
            path: 文件路径
            verbose: 是否显示详细日志

        Returns:
            Dict[str, Any]: JSON内容

        Raises:
            FileNotFoundError: 文件不存在
            json.JSONDecodeError: JSON格式错误
        """
        if not path.exists():
            raise FileNotFoundError(f"文件不存在: {path}")

        if verbose:
            bera.logger.debug(f"读取JSON文件: {path}")

        content = path.read_text(encoding='utf-8')
        return json.loads(content)

    @classmethod
    def copy_file(cls, src: Path, dst: Path, verbose: bool = False) -> None:
        """复制文件

        Args:
            src: 源文件路径
            dst: 目标文件路径
            verbose: 是否显示详细日志

        Raises:
            FileNotFoundError: 源文件不存在
        """
        if not src.exists():
            raise FileNotFoundError(f"源文件不存在: {src}")

        cls.ensure_directory(dst.parent)
        shutil.copy2(src, dst)

        if verbose:
            bera.logger.debug(f"复制文件: {src} -> {dst}")

    @classmethod
    def ensure_directory(cls, path: Path) -> None:
        """确保目录存在，如果不存在则创建

        Args:
            path: 目录路径
        """
        path.mkdir(parents=True, exist_ok=True)
        bera.logger.debug(f"确保目录存在: {path}")

    @classmethod
    def clean_directory(cls, path: Path, verbose: bool = False) -> None:
        """清理目录（如果存在则删除后重新创建）

        Args:
            path: 目录路径
            verbose: 是否显示详细日志
        """
        if path.exists():
            shutil.rmtree(path)
            if verbose:
                bera.logger.debug(f"删除目录: {path}")

        path.mkdir(parents=True)
        if verbose:
            bera.logger.debug(f"创建目录: {path}")

    @classmethod
    def copy_sql_file(cls, src: Path, dst: Path, verbose: bool = False) -> None:
        """复制 SQL 文件

        Args:
            src: 源文件路径
            dst: 目标文件路径
            verbose: 是否显示详细日志

        Raises:
            FileNotFoundError: 源文件不存在
        """
        if not src.exists():
            raise FileNotFoundError(f"源文件不存在: {src}")

        cls.ensure_directory(dst.parent)
        shutil.copy2(src, dst)

        if verbose:
            bera.logger.debug(f"复制文件: {src} -> {dst}")

    @classmethod
    def is_sql_file(cls, filepath: Path) -> bool:
        """检查文件是否为SQL文件

        Args:
            filepath: 文件路径

        Returns:
            bool: 如果文件以.sql结尾返回True，否则返回False
        """
        return filepath.suffix.lower() == '.sql'

    @classmethod
    def handle_file_error(cls, error: Exception, filepath: Path, table_name: str = None) -> None:
        """统一处理文件相关错误

        Args:
            error: 异常对象
            filepath: 文件路径
            table_name: 表名，可选

        Raises:
            FileNotFoundError: 当文件不存在时抛出
            ValueError: 当文件格式不正确时抛出
        """
        if isinstance(error, FileNotFoundError):
            if table_name:
                bera.logger.warning(f"未找到SQL文件: {table_name}")
            else:
                bera.logger.warning(f"未找到文件: {filepath}")
            raise error
        elif isinstance(error, ValueError):
            bera.logger.warning(f"文件格式不正确: {filepath}")
            raise error
        else:
            bera.logger.error(f"处理文件时发生错误: {filepath}")
            raise error